////////////////////////////////////////////////////////////////////
// Programme de dump des fichiers de Chrono Cross
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
// Nemesis pour Terminus Traduction (tt_nemesis@yahoo.fr)
// Date de création :		14/05/04
// Dernière modification :	26/05/04
////////////////////////////////////////////////////////////////////

// Interfaçage avec Java
#include <jni.h>

// Inclusions
#include <io.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <direct.h>
#include <errno.h>

// Choix
#define OUI				1
#define NON				0

// Erreur pouvant parvenir
#define ERROR_NONE		0
#define ERROR_FILE		1
#define ERROR_CD		2
#define ERROR_DRIVE		3
#define ERROR_SECTOR	4
#define ERROR_ROOM		5
#define ERROR_OVER		6
#define ERROR_DIR		7
#define ERROR_ISO		8
  
// Informations sur les fichiers
#define FICH_MAX		100
#define DIR_BASE		".\\Patch"
#define DIR_SUFF		"_"
#define IPS_EXT			".ips"
#define NB_MAX			200

// Buffer de copie
#define BUFFER			2048

// Informations sur les Rooms
#define ROOMS_SECT		24
#define ROOMS_NB_MAX	6000

// Infos sur les secteurs 2352/MODE2
#define SECTEUR_DEBUT 12
#define SECTEUR_NUM 4
#define SECTEUR_SUB 8
// Entete de 24 octets
#define SECTEUR_ENTETE (SECTEUR_DEBUT+SECTEUR_SUB+SECTEUR_NUM)
#define SECTEUR_DONNEES 2048
#define SECTEUR_ECC 280
// Secteur de 2352 octets
#define SECTEUR_TOTAL (SECTEUR_ENTETE+SECTEUR_DONNEES+SECTEUR_ECC)
// Secteur + EDC/ECC et place pour les calculs
#define SECTEUR_EDCECC 2448

// Type de secteur
#define SECT_TFICH	0
#define SECT_TFIN	1
#define SECT_TAUTRE 2
#define SECT_ERREUR 3

// Declarations Fichiers
int Fichier_Completer (char *fichier);

// Declarations Iso
int Iso_Ouvre (char *iso);
int Iso_Ferme (void);
int Iso_Taille (int *taille);
int Iso_Position (void);
void Iso_Secteur_Saut (unsigned int secteur);
void Iso_ECC_Saut (void);
void Iso_Entete_Saut (void);
int Iso_Align (void);
int	Iso_Entete_Lit (int test);
void Iso_Entete_Modif (int type);
int Iso_Test_Debut(unsigned char *debut);
int Iso_Test_Sub (unsigned char sub[SECTEUR_SUB]);
void Iso_Flush(void);
void Iso_Adresses_Lit(unsigned int *buffer);
int Iso_Adresses_Ecrit(unsigned int *buffer);
void Iso_Secteur_Extrait(FILE *fich);
void Iso_Donnees_Extrait(FILE *fich,unsigned char fin);
int Iso_Secteur_Insere(unsigned char donnees[SECTEUR_DONNEES]);
int Iso_Donnees_Insere(FILE *fich);

// EDC/ECC par Yazoo (plus efficace et de loin)
/* known sector types */
#define MODE_0	0
#define MODE_1	1
#define MODE_2	2
#define MODE_2_FORM_1	3
#define MODE_2_FORM_2	4

#define RS_L12_BITS 8

/* audio sector definitions for CIRC */
#define FRAMES_PER_SECTOR 98
/* user data bytes per frame */
#define L1_RAW 24
/* parity bytes with 8 bit */
#define L1_Q   4
#define L1_P   4

/* data sector definitions for RSPC */
/* user data bytes per frame */
#define L2_RAW (1024*2)
/* parity bytes for 16 bit units */
#define L2_Q   (26*2*2)
#define L2_P   (43*2*2)

/* Layer 2 Product code en/decoder */
int do_encode_L2(unsigned char inout[(12 + 4 + L2_RAW+4+8+L2_Q+L2_P)], int sectortype, unsigned address);


// Prototypes des procédures

#ifndef _Included_Librairie
#define _Included_Librairie
#ifdef __cplusplus
extern "C" {
#endif
	
// ImageCD

JNIEXPORT jint JNICALL Java_Librairie_imageCD_1init
  (JNIEnv *, jclass, jstring, jstring);

JNIEXPORT jint JNICALL Java_Librairie_imageCD_1testDrive
	(JNIEnv *env, jclass classe, jchar s);

JNIEXPORT jint JNICALL Java_Librairie_imageCD_1readSector
  (JNIEnv *, jclass, jint);

JNIEXPORT jint JNICALL Java_Librairie_imageCD_1close
  (JNIEnv *, jclass);

JNIEXPORT jint JNICALL Java_Librairie_imageCD_1nbSectors
  (JNIEnv *, jclass);

// Declarations DumpRein

JNIEXPORT jint JNICALL Java_Librairie_dumpRein_1init
  (JNIEnv *, jclass, jstring);

JNIEXPORT jint JNICALL Java_Librairie_dumpRein_1dump
  (JNIEnv *, jclass, jint);

JNIEXPORT jint JNICALL Java_Librairie_dumpRein_1rein
  (JNIEnv *, jclass, jint);

JNIEXPORT jint JNICALL Java_Librairie_dumpRein_1close
  (JNIEnv *, jclass);

void dumpRein_pointeursModif(void);

// Compression et décompression Cpt

JNIEXPORT jint JNICALL Java_Librairie_cpt_1decompression
  (JNIEnv *, jclass, jstring);

JNIEXPORT jint JNICALL Java_Librairie_cpt_1compression
  (JNIEnv *, jclass, jstring);

// Compression et décompression Drp

JNIEXPORT jint JNICALL Java_Librairie_drp_1decompression
  (JNIEnv *, jclass, jstring);

JNIEXPORT jint JNICALL Java_Librairie_drp_1compression
  (JNIEnv *, jclass, jstring);

// Declarations DumpRein

JNIEXPORT jint JNICALL Java_Librairie_ips_1appliquer
  (JNIEnv *, jclass, jstring);



#ifdef __cplusplus
}
#endif
#endif